#include "Sem_V2.hpp"
#include <unistd.h>
#include <ctime>
#include <cstdio>

int main()
{
    // 基于抽象接口类的具体建造者
    std::shared_ptr<SemaphoreBuilder> builder = std::make_shared<ConcreteSemaphoreBuilder>();
    // 指挥者对象
    std::shared_ptr<Director> director = std::make_shared<Director>();

    // 在指挥者的指导下，建造者完成构建过程
    director->Construct(builder, BUILD_SEM, 0600, 3, {1, 2, 3});

    // 完成了对象的创建过程，获取对象
    auto sem = builder->GetSem();

    srand(time(0) ^ getpid());

    // 期望父子打印的时候，C或者F必须成对出现!
    pid_t pid = fork();
    if (pid == 0)
    {
        while (true)
        {
            sem->P(0);
            printf("C");
            usleep(rand() % 95270);
            fflush(stdout);
            printf("C");
            usleep(rand() % 43990);
            fflush(stdout);
            sem->V(0);
        }
    }

    while (true)
    {
        sem->P(0);
        printf("F");
        usleep(rand() % 95270);
        fflush(stdout);
        printf("F");
        usleep(rand() % 43990);
        fflush(stdout);
        sem->V(0);
    }



    return 0;








    // SemaphoreBuilder sb;
    // auto fsem = sb.SetVar(1).build(BUILD_SEM, 1);     // 级联式的创建（修改）和调用
    // srand(time(0) ^ getpid());

    // // 期望父子打印的时候，C或者F必须成对出现!
    // pid_t pid = fork();
    // if (pid == 0)
    // {
    //     auto csem = sb.build(GET_SEM);
    //     while (true)
    //     {
    //         csem->P();
    //         printf("C");
    //         usleep(rand() % 95270);
    //         fflush(stdout);
    //         printf("C");
    //         usleep(rand() % 43990);
    //         fflush(stdout);
    //         csem->V();
    //     }
    // }

    // while (true)
    // {
    //     fsem->P();
    //     printf("F");
    //     usleep(rand() % 95270);
    //     fflush(stdout);
    //     printf("F");
    //     usleep(rand() % 43990);
    //     fflush(stdout);
    //     fsem->V();
    // }

    // return 0;
}